package com.lx.boot.web.convert.serializer;

import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.lx.annotation.Note;
import com.lx.boot.web.convert.DFunction;
import com.lx.boot.web.convert.serializer.DictSerializer.DictUtils;
import com.lx.util.LX;

import java.lang.annotation.*;
import java.util.Arrays;

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.TYPE,ElementType.PARAMETER})
@Documented
@JacksonAnnotationsInside
@Serializer(value = DictEnumSerializer.class,function = DictEnumSerializer.EecoderDFunction.class)
@Note("返回值枚举字典处理器")
public @interface DictEnumSerializer {

    @Note("指定code字段, 不指定时 获取注解所在字段的值")
    String codeField() default "";

    @Note("指定枚举类 通过枚举类获取字典")
    Class<? extends DictEnum> enumClass();

    public static class EecoderDFunction implements DFunction<SerializerPara, DictEnumSerializer, Object> {
        @Override
        public Object apply(SerializerPara para, DictEnumSerializer convert) {
            // 获取code值
            String code = null;
            if (LX.isNotEmpty(convert.codeField())){
                code = (String) para.getValue(convert.codeField());
            }else {
                code = (String) para.getValue();
            }
            LX.exMsg(!convert.enumClass().isEnum(), "请选择实现DictEnum的枚举类");
            return getValue(convert.enumClass(),code);
        }

        public static String getValue(Class<? extends DictEnum> enumType, String code) {
            return Arrays.stream(enumType.getEnumConstants())
                    .filter(e -> e.getCode().equals(code))
                    .findFirst()
                    .map(DictEnum::getValue)
                    .orElse(null);
        }
    }

//    @Getter
//    @AllArgsConstructor
//    public enum Gender implements DictEnum {
//        MALE("1", "男"),
//        FEMALE("2", "女");
//        private final String code;
//        private final String value;
//    }
    public interface DictEnum {
        String getCode();
        String getValue();
    }
}
